﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using blacksoft.Models;
using blacksoft.Constantes;


namespace blacksoft.Controllers
{
    public class DocumentoPagoController : Controller
    {
        private inf245travelbusEntities db = new inf245travelbusEntities();
        ///
        private string[] estados = { "AC", "IN","PG" };

        ///////////////////////////////////////////////////
        public static IEnumerable<T> Flatten<T>(T[,] items)
        {
            for (int i = 0; i < items.GetLength(0); i++)
                for (int j = 0; j < items.GetLength(1); j++)
                    yield return items[i, j];
        }
        /// <summary>
        /// ///////////////////////////
        /// </summary>
        private class itemListaEstados {
            public string est { get; set; }
            public itemListaEstados(string est) {
                this.est = est;
            }
        }
        private List<itemListaEstados> obtenerListaEstadosExt()
        {
            var est_qry = from e in db.DocumentoPago
                          select e;
            List<itemListaEstados> estados_lst = new List<itemListaEstados>();
            foreach (var estado in est_qry) {
                estados_lst.Add(new itemListaEstados(estado.Estado));
                
            }
            estados_lst.Distinct().ToList();

            return estados_lst;
        }
      
        
        // GET: /DocumentoPago/
        public ActionResult Index()
        {
            // **** SEGURIDAD DE ACCESO ****
            ActionResult result_seguridad = ValidarSeguridad();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            //  ------             --------

            // ****  GET ID Terminal    ****
            int idTerminal = (int)Session["IDTerminal"];
            //  ------             --------
            
            //  ------             --------
            // ****    Check Global     ****
            bool global = PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.GLOBAL);
            // ------              --------
            
            var docpago = db.DocumentoPago.Include(a => a.OrdenCompra);
            if (!global)
            {
                docpago = docpago.Where(a => a.OrdenCompra.IDTerminal == idTerminal);

            }
            return View(docpago.ToList());
        }


        // GET: /DocumentoPago/Create
        public ActionResult Create()
        {
            // **** SEGURIDAD DE ACCESO ****
            ActionResult result_seguridad = ValidarSeguridad();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            //  ------             --------

            // ****  GET ID Terminal    ****
            int idTerminal = (int)Session["IDTerminal"];
            // ------              --------

            //  ------             --------
            // ****    Check Global     ****
            bool global = PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.GLOBAL);
            // ------              --------
            var ordencompra = db.OrdenCompra.Include(o => o.Persona).Include(o => o.Terminal);
            ordencompra = ordencompra.Where(oc => oc.Estado == "AC");
            if (!global)
            {
                ordencompra = ordencompra.Where(oc => oc.IDTerminal == idTerminal);
            }
            ViewBag.IDOrdenCompra = new SelectList(ordencompra, "IDOrdenCompra", "IDOrdenCompra");
            return View();
        }

        // POST: /DocumentoPago/Create
        // Para protegerse de ataques de publicación excesiva, habilite las propiedades específicas a las que desea enlazarse. Para obtener 
        // más información vea http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "IDDocumentoPago,FechaPago,FechaLimite,Estado,IDOrdenCompra,NroFactura")] DocumentoPago documentopago)
        {
            documentopago.Estado = "AC";
            if (ModelState.IsValid)
            {
                var dbCompra = from c in db.OrdenCompra
                               where c.IDOrdenCompra == documentopago.IDOrdenCompra
                               select c;
                OrdenCompra oc;
                try { 
                oc = dbCompra.ToList().ElementAt(0);
                oc.Estado = "RG";
                }
                catch
                {
                }
                db.DocumentoPago.Add(documentopago);
                db.SaveChanges();
                return RedirectToAction("Index");
            }


            ViewBag.IDOrdenCompra = new SelectList(db.OrdenCompra, "IDOrdenCompra", "IDOrdenCompra", documentopago.IDOrdenCompra);

            return View(documentopago);
        }

        // GET: /DocumentoPago/Edit/5
        public ActionResult Edit(int? id)
        {
            // **** SEGURIDAD DE ACCESO ****
            ActionResult result_seguridad = ValidarSeguridad();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            //  ------             --------
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            DocumentoPago docpago = db.DocumentoPago.Find(id);

            if (docpago == null)
            {
                return HttpNotFound();
            }


            if (docpago.Estado == "PG")
                //para que no se pueda volver a editar si ya esta pagado
                return RedirectToAction("Index");
            SelectList estado = new SelectList(estados,docpago.Estado );
            ViewBag.Estado = estado;
            return View(docpago);
        }

        // POST: /DocumentoPago/Edit/5
        // Para protegerse de ataques de publicación excesiva, habilite las propiedades específicas a las que desea enlazarse. Para obtener 
        // más información vea http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "IDDocumentoPago,FechaLimite,NroFactura,Estado,IDOrdenCompra")] DocumentoPago docpago)
        {
            // **** SEGURIDAD DE ACCESO ****
            ActionResult result_seguridad = ValidarSeguridad();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            //  ------             --------
            // ****  GET ID Terminal    ****
            int idTerminal = (int)Session["IDTerminal"];
            // ------              --------
            int aumento=0;
            if (ModelState.IsValid)
            {
                
                db.Entry(docpago).State = EntityState.Modified;
                //Luego de que se modifica el estado de el documento de pago a pagado, se tiene q aumentar el stock

                if (docpago.Estado == "PG")
                {
                    docpago.FechaPago = DateTime.Today;
                    //aumento de stock
                    ///se selecciona la coleccion de productos en la orden de compra
                    var prodOCcolecccion = from m in db.Detalle_OrdenCompra
                                           where m.IDOrdenCompra == docpago.IDOrdenCompra
                                           select m;
                
                    // cambiar el estado de la orden de compra
                    var oc = from k in db.OrdenCompra
                             where k.IDOrdenCompra == docpago.IDOrdenCompra
                             select k;
                    try {
                        OrdenCompra ordencompraEP = oc.Single();
                        ordencompraEP.Estado = "PG";

                    }catch(System.ArgumentNullException){
                    }catch(System.InvalidOperationException){}



                ///por cada producto de la orden de compra
                    foreach (var item in prodOCcolecccion)
                    {
                        aumento = (int)item.Cantidad;

                        Almacen productoenalmacen;

                        /////se selecciona el producto
                        var result = from n in db.Almacen
                                     where n.IDProducto == item.IDProducto 
                                     select n;
                        if ( result.Count() > 0)
                        {
                            try
                            {
                                productoenalmacen = result.Single();
                                //////se aumenta el stock
                                if (productoenalmacen.StockMax >= productoenalmacen.StockActual + aumento)
                                    productoenalmacen.StockActual = productoenalmacen.StockActual + aumento;
                                //deberia haber manera de manejar cuando sobrepasa el stock maximo 
                            }
                            catch (ArgumentNullException) { }
                            catch (InvalidOperationException) { }
                        }
                        else//si el producto no esta en  almacen
                        {
                           
                            var result2 = from o in db.Producto
                                          where o.IDProducto == item.IDProducto
                                          select o;

                            if (result2 != null)
                            {
                                Almacen nuevoProd = new Almacen { IDProducto = (int)item.IDProducto, IDTerminal = idTerminal, Producto = item.Producto, StockActual = item.Cantidad, StockMax = 1000, StockMin = 0 };
                                db.Almacen.Add(nuevoProd);

                            }

                        }
                    }
                    db.SaveChanges();
                    
                }

                db.SaveChanges();
                return RedirectToAction("Index");
            }

            SelectList estado = new SelectList(estados, docpago.Estado);
            ViewBag.Estado = estado;
           
            return View(docpago);
        }


        // GET: /DocumentoPago/Delete/5
        public ActionResult Delete(int? id)
        {
            // **** SEGURIDAD DE ACCESO ****
            ActionResult result_seguridad = ValidarSeguridad();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            //  ------             --------
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            DocumentoPago docpago = db.DocumentoPago.Find(id);
            if (docpago == null)
            {
                return HttpNotFound();
            }
            return View(docpago);
        }

        // POST: /DocumentoPago/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            // **** SEGURIDAD DE ACCESO ****
            ActionResult result_seguridad = ValidarSeguridad();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            //  ------             --------
            DocumentoPago docpago = db.DocumentoPago.Find(id);
            db.DocumentoPago.Remove(docpago);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        // GET: /DocumentoPago/Details/5
        public ActionResult Details(int? id)
        {
            // **** SEGURIDAD DE ACCESO ****
            ActionResult result_seguridad = ValidarSeguridad();
            if (result_seguridad != null)
            {
                return result_seguridad;
            }
            //  ------             --------
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            DocumentoPago docpago = db.DocumentoPago.Find(id);
            if (docpago == null)
            {
                return HttpNotFound();
            }

            if (docpago.Estado == "AC")
                ViewBag.strEstado = "ACTIVO";
            else if (docpago.Estado == "IN")
                ViewBag.strEstado = "INACTIVO";
            else if (docpago.Estado == "PG")
                ViewBag.strEstado = "PAGADO";

            if (docpago.OrdenCompra.Estado == "AC")
                ViewBag.strEstadoOC = "ACTIVO";
            else if (docpago.OrdenCompra.Estado == "IN")
                ViewBag.strEstadoOC = "INACTIVO";
            else if (docpago.OrdenCompra.Estado == "PG")
                ViewBag.strEstadoOC = "PAGADO";
           

            return View(docpago);
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }

        private ActionResult ValidarSeguridad()
        {

            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.COMPRAS))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            return null;
        }

	}
}